﻿// See https://aka.ms/new-console-template for more information

using Microsoft.Extensions.AI;
using ModelContextProtocol.Client;
using OpenAI;
using OpenAI.Chat;
using System.ClientModel;
using System.Text;

Console.WriteLine($"程序启动中，请稍等");

McpClientOptions options = new()
{
    ClientInfo = new() { Name = "EdanAI Client", Version = "1.0.0" }
};

//1：注册MCPServer SSE远程方式连接MCPWebAPI
var config = new SseClientTransport(
    // 配置传输选项，指定服务端点（Endpoint）
    new SseClientTransportOptions()
    {
        Name = "EdanAI MCP Server",
        TransportMode = HttpTransportMode.Sse,
        // 设置远程服务器的 URI 地址
        Endpoint = new Uri("http://localhost:5001/sse")
    }
);

//2：创建MCPClient
await using var mcpClient = await McpClientFactory.CreateAsync(config, options);

//3：发现MCPServer中的Tool
var mcpTools = await mcpClient.ListToolsAsync();
foreach (var tool in mcpTools)
{
    Console.WriteLine($"{tool.Name} ({tool.Description})");
}

//4：注册大模型
//使用远程模型。以阿里云百炼平台为例 key
IChatClient openaiClient = new ChatClient("qwen-max", new ApiKeyCredential("sk-17d75a977f544261960af51dd45470be"), new OpenAIClientOptions
{
    Endpoint = new Uri("https://dashscope.aliyuncs.com/compatible-mode/v1")
})
.AsIChatClient();

//5：创建Chat客户端
var client = new ChatClientBuilder(openaiClient)
    //向聊天客户端添加函数调用
    .UseFunctionInvocation()
    .Build();

//6：执行对话
//后续需要实现上下文对话 不要每次都新开对话
var prompt = """
    你是一个MCP数据查询助理；在输出数据库数据时，请以参数ChatOptions的Tools调用内置MCP相关函数连接指定数据库执行sql返回excel行列结构数据；在输出磁盘文件内容时，我的主机名是Administrator。
    """;
// 🎯 维护对话历史，实现上下文对话
IList<Microsoft.Extensions.AI.ChatMessage> conversationHistory =
[
    //为ai设定身份
    new(ChatRole.System, prompt)
];

while (true)
{
    Console.WriteLine("这里是数据查询服务，你想什么数据？");
    string? userInput = Console.ReadLine();
    if (string.IsNullOrEmpty(userInput))
        break;
    if (userInput.Trim().Equals("EXIT", StringComparison.OrdinalIgnoreCase))
    {
        Console.WriteLine("程序退出");
        return;
    }
    if (userInput.Trim().Equals("Clear", StringComparison.OrdinalIgnoreCase))
    {
        conversationHistory.Clear();
        conversationHistory.Add(new(ChatRole.System, prompt));
        continue;
    }

    conversationHistory.Add(new(ChatRole.User, userInput));

    //使用流式输出，像ChatGPT一样逐字显示
    StringBuilder fullResponse = new StringBuilder();

    //注意，某些大模型要求流水输出，只能使用GetStreamingResponseAsync方式。
    await foreach (ChatResponseUpdate update in client.GetStreamingResponseAsync(conversationHistory))
    {
        // 实时输出每个字符
        Console.Write(update);
        // 收集完整回复
        fullResponse.Append(update.ToString());
    }

    // 添加完整的AI回复到历史记录
    conversationHistory.Add(new(ChatRole.Assistant, fullResponse.ToString()));    
}